【基础算法】刷题记录 2018-03-13

  • 二维数组中的查找
  • 二分查找
  • 连续子数组的最大和

二维数组中的查找

问题

在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

解法

矩阵是有序的,从左下角来看,向上数字递减,向右数字递增,因此从左下角开始查找。当要查找数字比左下角数字大时,右移;要查找数字比左下角数字小时,上移。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class Solution {
public boolean Find(int target, int [][] array) {
int x = 0;
int y = array[0].length -1;
while(x<array[0].length && y>=0){
if(array[x][y] > target){
y -= 1;
continue;
}
else if(array[x][y] < target){
x += 1;
continue;
}
else{
return true;
}
}
return false;
}
}

二分查找

问题

对于一个有序数组,我们通常采用二分查找的方式来定位某一元素,请编写二分查找的算法,在数组中查找指定元素。
给定一个整数数组A及它的大小n,同时给定要查找的元素val,请返回它在数组中的位置(从0开始),若不存在该元素,返回-1。若该元素出现多次,请返回第一次出现的位置。

易错点

[4,4,8,10] 4 4 按常规二分查找返回的是1,本题应返回的是0

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class BinarySearch {
public int getPos(int[] A, int n, int val) {
int left = 0;
int right = n-1;
while(left<=right){
int current = (left+right)/2;
if(val < A[current]){
right = current -1;
continue;
}
else if (val > A[current]){
left = current +1;
continue;
}
else{
while(current > 0 && A[current-1] == A[current]){
current -= 1;
}
return current;
}
}
return -1;
}
}

连续最大和

问题

一个数组有 N 个元素,求连续子数组的最大和。 例如:[-1,2,1],和最大的连续子数组为[2,1],其和为 3

思路

动态规划。
如果用函数 f(i)表示以第 i 个数字结尾的子数组的最大和,那么我们需要求出 max[f(i)],其中 0 <= i < n。我们可用如下边归公式求 f(i):

$$f(i)=\begin{cases}pData[i]& \text{i=0 or f(i-1) <= 0}\\f(i-1)+pData[i]& \text{i!=0 and f(i-1)>0}\end{cases}$$

这个公式的意义:当以第 i-1 个数字结尾的子数组中所有数字的和小于 0 时,如果把这个负数与第 i 个数累加,得到的结果比第 i 个数字本身还要小,所以这种情况下以第 i 个数字结尾的子数组就是第 i 个数字本身。如果以第 i-1 个数字结尾的子数组中所有数字的和大于 0,与第 i 个数字累加就得到以第 i 个数字结尾的子数组中所有数字的和。

易错点

很容易忽略全都是负数的情况,例如[-1,-2,-3,-4]。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
using namespace std;
int main(){
int n;
cin>>n;
int a[n];
for(int i=0; i<n; i++){
cin>>a[i];
}
int max =a[0];
int curMax = 0;
for(int j=1; j<n; j++){
if(curMax < 0){
curMax =a[j];
}else{
curMax += a[j];
}
if(max < curMax){
max = curMax;
}
}
cout<<max;
return 0;
}